package com.shiro.shiro_demo.servicetest;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class ShiroTest {
    /**
     * 模拟用户输入的账号密码
     */
    private String username = "zhangsan";
    private String password = "123456";


    @Test
    public void test1(){
//        1.获取配置文件中的数据 得到安全管理器工厂
        IniSecurityManagerFactory factory =
                new IniSecurityManagerFactory("classpath:shiro.ini");

//        2.获取安全管理器  安全管理器封装了配置文件数据【相当于得到数据库中所有的数据】
        SecurityManager securityManager = factory.getInstance();

//        把安全管理器给工具类 相当于Subject和安全管理器建立的联系
        SecurityUtils.setSecurityManager(securityManager);

//        3.获取Subject  主体不是new的  而是通过工具类获取的
        Subject subject = SecurityUtils.getSubject();

//        4.把用户输入的账号密码给Subject  调用登录方法的时候 传入用户输入的账号密码【封装到token】
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        /**
         * login 通过抛异常的方式 告诉用户有没有认证成功
         * UnknownAccountException 不知道账号异常 账号错误
         * IncorrectCredentialsException  不正确的密码  密码错误
         */
        try{
            subject.login(token);
            System.out.println("登录成功");
        }catch (Exception e){
            System.out.println("错误");

        }

        /**
         * isAuthenticated 查询当前主体的认证状态
         * Authenticate 认证
         */
        boolean authenticated = subject.isAuthenticated();
        System.out.println(authenticated);
    }
}
